package com.situ.fly.service.impl;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.situ.fly.entity.User;
import com.situ.fly.mapper.UserMapper;
import com.situ.fly.service.UserService;
import com.situ.fly.util.MD5Util;

/*
 * 1. 创建Service层的接口
 * 2. 创建Service层接口的实现类
 * 3. 在类前加注解 @Service
 * 4. 添加接口中的方法
 */
@Service
public class UserServiceImpl implements UserService{

	/**
	 * 创建一个Mapper层的对象
	 * @Autowired 将会从Spring容器中找到一个类型匹配的对象, 赋值给变量
	 */
	@Autowired
	private UserMapper userMapper;
	
	@Override
	public int reg(User user, String rePassword) {
		
		//1)	验证用户输入信息的全法性
		// 账号密码昵称长度
		if (user.getUsername().length()<3 ||
				user.getPassword().length()<3 ||
				user.getNickname().length()<2) {
			
			return -1;
		}
		
		// 两次密码必须一致
		if (!user.getPassword().equals(rePassword)) {
			return -2;
		}
		
		//2)	验证用户的账号是否可用
		User user2 = userMapper.selectByUserName(user.getUsername());
		if (user2 != null) {
			return -3;
		}
		
		//3)	验证用户的昵称是否可用
		user2 = userMapper.selectByNickName(user.getNickname());
		if (user2 != null) {
			return -4;
		}
		
		//4)	加密 并保存到数据库中
		user.setPassword(MD5Util.getMD5(user.getPassword()));
		
		return userMapper.insert(user);
	}

	@Override
	public User login(User user) throws Exception {
		// 1. 验证输入合法性, 账号, 密码长度
		if (user.getUsername().length() < 3 ||
				user.getPassword().length() < 3) {
			// 账号和密码至少3位
			// 抛出异常
			throw new Exception("账号和密码至少3位");
		}
		
		// 2. 根据用户名查询数据库
		User selectUser = userMapper.selectByUserName(user.getUsername());
		if (selectUser == null) {
			// 用户不存在
			throw new Exception("用户不存在");
		}
		
		// 3. 验证密码
		if (!selectUser.getPassword().equals(MD5Util.getMD5(user.getPassword()))) {
			// 密码不正确
			throw new Exception("密码不正确");
		}
		
		// 4. 验证状态
		if (selectUser.getStatus() == 1) {
			// 用户被禁用
			throw new Exception("用户被禁用");
		}
		
		// 登录成功
		return selectUser;
	}

	@Override
	public int edit(User user) {
		// 昵称必须要进行验证
		if (user.getNickname().length() < 2) {
			return -1;
		}
		
		// 昵称重复
		User selectUser = userMapper.selectByNickName(user.getNickname());
		if (selectUser != null && selectUser.getId() != user.getId()) {
			return -2;
		}
		
		return userMapper.update(user);
	}

	@Override
	public User getById(Integer id) {
		return userMapper.selectById(id);
	}

	@Override
	public int resetPassword(Integer id, String nowpass, String pass, String repass) {
		// 两次密码
		if (!pass.equals(repass)) {
			return -1;
		}
		
		// 验证旧密码
		User user = userMapper.selectById(id);
		nowpass = MD5Util.getMD5(nowpass);
		if (!user.getPassword().equals(nowpass)) {
			return -2;
		}
		
		// 新密码加密
		pass = MD5Util.getMD5(pass);
		
		return userMapper.updatePassword(id, pass);
	}

	@Override
	public int setHead(Integer id, String head) {
		return userMapper.updateHead(id, head);
	}

	@Override
	public List getByReplyNum(Integer limit) {
		return userMapper.selectByReplyNum(limit);
	}
}
